"use strict"
const StylelintPlugin = require("stylelint-webpack-plugin")
const path = require("path")
function resolve(dir) {
	return path.join(__dirname, dir)
}

const DonePlugin = {
	apply: compiler => {
		compiler.hooks.done.tap("DonePlugin", stats => {
			console.log("Compile is done !")
			//防止本地启动执行yarn dev后， 中断命令行
			if (process.env.NODE_ENV !== "development") {
				setTimeout(() => {
					process.exit(0)
				})
			}
		})
	}
}

const name = "IBE信息化平台" // page title

// If your port is set to 80,
// use administrator privileges to execute the command line.
// For example, Mac: sudo npm run
// You can change the port by the following methods:
// port = 8090 npm run dev OR npm run dev --port = 8090
// const port = process.env.port || process.env.npm_config_port || 8094 // dev port

// All configuration item explanations can be find in https://cli.vuejs.org/config/
module.exports = {
	/**
	 * You will need to set publicPath if you plan to deploy your site under a sub path,
	 * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/,
	 * then publicPath should be set to "/bar/".
	 * In most cases please use '/' !!!
	 * Detail: https://cli.vuejs.org/config/#publicpath
	 */
	publicPath: "/",
	outputDir: "dist",
	assetsDir: "static",
	lintOnSave: process.env.NODE_ENV === "development",
	productionSourceMap: false,
	devServer: {
		port: 8000,
		proxy: {
			[process.env.VUE_APP_BASE_API]: {
				target: "http://192.168.0.121:8443/", // dev
				// target: "http://172.16.105.45:8443/", // test
				// target: "http://172.16.105.44:8443/", // dev
				changeOrigin: true,
				pathRewrite: {
					["^" + process.env.VUE_APP_BASE_API]: ""
				}
			}
		},
		open: true,
		overlay: {
			warnings: false,
			errors: true
		}
	},
	configureWebpack: {
		// provide the app's title in webpack's name field, so that
		// it can be accessed in index.html to inject the correct title.
		name: name,
		resolve: {
			alias: {
				"@": resolve("src")
			}
		},
		plugins: [DonePlugin]
	},
	transpileDependencies: ["el-bigdata-table"],
	chainWebpack(config) {
		// it can improve the speed of the first screen, it is recommended to turn on preload
		config.plugin("preload").tap(() => [
			{
				rel: "preload",
				// to ignore runtime.js
				// https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
				fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
				include: "initial"
			}
		])

		// css
		config.plugin("stylelint").use(StylelintPlugin, [
			{
				files: ["**/*.{html,vue,css,sass,scss}"],
				fix: false, // 自动修复
				cache: true,
				emitError: true,
				failOnError: false
			}
		])

		// 参考 https://github.com/vuejs/vue-cli/issues/3088#issuecomment-572899228
		// config.optimization.minimizer("terser").tap(args => {
		// 	args[0].terserOptions.compress.drop_console = true
		// 	return args
		// })

		// when there are many pages, it will cause too many meaningless requests
		config.plugins.delete("prefetch")

		const oneOfsMap = config.module.rule("scss").oneOfs.store
		oneOfsMap.forEach(item => {
			item
				.use("sass-resources-loader")
				.loader("sass-resources-loader")
				.options({
					resources: [
						resolve("src/styles/xr-theme.scss"),
						resolve(
							"node_modules/element-ui/packages/theme-chalk/src/common/var.scss"
						)
					]
				})
				.end()
		})

		// set svg-sprite-loader
		config.module.rule("svg").exclude.add(resolve("src/icons")).end()
		config.module
			.rule("icons")
			.test(/\.svg$/)
			.include.add(resolve("src/icons"))
			.end()
			.use("svg-sprite-loader")
			.loader("svg-sprite-loader")
			.options({
				symbolId: "icon-[name]"
			})
			.end()

		// config.when(process.env.NODE_ENV !== "development", config => {
		// 	config
		// 		.plugin("ScriptExtHtmlWebpackPlugin")
		// 		.after("html")
		// 		.use("script-ext-html-webpack-plugin", [
		// 			{
		// 				// `runtime` must same as runtimeChunk name. default is `runtime`
		// 				inline: /runtime\..*\.js$/
		// 			}
		// 		])
		// 		.end()
		// 	config.optimization.splitChunks({
		// 		chunks: "all",
		// 		cacheGroups: {
		// 			libs: {
		// 				name: "chunk-libs",
		// 				test: /[\\/]node_modules[\\/]/,
		// 				priority: 10,
		// 				chunks: "initial" // only package third parties that are initially dependent
		// 			},
		// 			elementUI: {
		// 				name: "chunk-elementUI", // split elementUI into a single package
		// 				priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
		// 				test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
		// 			},
		// 			commons: {
		// 				name: "chunk-commons",
		// 				test: resolve("src/components"), // can customize your rules
		// 				minChunks: 3, //  minimum common number
		// 				priority: 5,
		// 				reuseExistingChunk: true
		// 			}
		// 		}
		// 	})
		// 	// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
		// 	config.optimization.runtimeChunk("single")
		// })
	}
}
